package com.liangdemo.web.redis;


import com.liangdemo.web.utils.ajax.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * @author Mr.Liang
 * @date 2022/4/25 11:49
 */
@RestController
@RequestMapping("/redis")
public class RedisController {
    @Autowired
    private RedisService redisService;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 保存Redis数据
     *
     * @param key
     * @param value
     * @return
     */
    @PostMapping("/setValue/{key}/{value}")
    public String setValue(@PathVariable("key") String key, @PathVariable("value") String value) {
        redisService.setCacheObject(key, value);
        return "保存成功";
    }

    /**
     * 获取Redis数据
     *
     * @param key
     * @return
     */
    @GetMapping("/getValue")
    public String getValue(@RequestParam String key) {
        redisTemplate.opsForValue();
        redisTemplate.boundValueOps("key").set("value");
        return redisService.getCacheObject(key);
    }

    /**
     * 保存一个数据，并且设置过期时间
     *
     * @return
     */
    @GetMapping("/set")
    private String demo() {
        redisService.set("name", "测试", 1000);
        return "设置成功";
    }

    /**
     * 根据key查询
     *
     * @return
     */
    @GetMapping("/get")
    private AjaxResult get() {
        Map<String, Object> map = new HashMap<>();
        map.put("time", redisService.getCacheMap("name"));
        List<String> list = redisService.getCacheList("key");
        redisTemplate.opsForList().range("list", 0, 1);


        return AjaxResult.success(redisTemplate.boundListOps("key").range(0, -1));
    }

    /**
     * 保存一个map数据
     */
    public void setMap() {
        BoundHashOperations car = redisTemplate.boundHashOps("car");
        //set
        car.put("id", 1);
        car.put("name", "张三");
        //get
        car.entries();
        //获取map中的某一项
        car.get("id");
        //删除整个car
        redisTemplate.delete(car);
        //删除某一项
        car.delete("id", "name");

        //获取map的长度
        car.size();
        //
    }


    /**
     * 保存一个list数据
     */
    @PostMapping("list1")
    public Long saveList() {
        List<String> list = new ArrayList<>();
        list.add("数据1");
        list.add("数据2");
        list.add("数据3");

        //两种方式均可保存，保存的样式不相同
        redisTemplate.opsForList().rightPushAll("key", list);

        redisTemplate.boundListOps("list").leftPush(list);
        return 1L;
    }

    /**
     * 保存一个list数据，并且设置过期时间
     */
    @PostMapping("/list")
    public void setList() {
        List<String> list = new ArrayList<>();
        list.add("数据1");
        list.add("数据2");
        list.add("数据3");
        redisTemplate.opsForList().rightPushAll("key", list);
        // redisTemplate.opsForValue().set("key", list, 100, TimeUnit.SECONDS);
    }

    /**
     * 删除Redis数据
     *
     * @param key
     * @return
     */
    @DeleteMapping("/deleteValue/{key}")
    public String deleteValue(@PathVariable("key") String key) {
        return redisService.deleteObject(key) ? "删除成功" : "删除失败";
    }

    /**
     * set集合
     */
    public void setSet() {
        Set<String> set = new HashSet<>();
        set.add("zhangsan");
        set.add("lisi");
        set.add("xueliu");
        redisTemplate.boundSetOps("set").add(set);

        //获取所有set
        redisTemplate.boundSetOps("set").members();
        //获取个数
        redisTemplate.boundSetOps("set").size();
        //判断某个元素判断是否存在set中
        redisTemplate.boundSetOps("set").isMember("zhangsan", "lisi");
        //获取随机元素
        redisTemplate.boundSetOps("set").randomMembers(3);

    }
}
